package com.gton.lpl.entity;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * @TableName gp-login
 * 注意swagger3 注解不一样了 ：参考：https://segmentfault.com/a/1190000040427585
 */
@TableName(value = "gp_login")
@Data
@ApiModel(value = "登录")
public class Gplogin implements Serializable {
    /**
     * 主键，采用雪花算法
     */
    @TableId(type = IdType.ASSIGN_ID)
    @ApiModelProperty(value = "主键",hidden = true)
    private Long id;

    /**
     * 用户登录名
     */
    @ApiModelProperty(value = "用户登录名",required = true)
    private String username;

    /**
     * 用户登录密码（加密）
     */
    @ApiModelProperty(value = "用户登录密码",required = true)
    private String password;

    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "创建时间",hidden = true)
    private LocalDateTime createTime;

    /**
     * 修改时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "修改时间",hidden = true)
    private LocalDateTime updateTime;

    /**
     * 欢迎名字（真实名字）
     */
    @ApiModelProperty(value = "用户真实名字",hidden = true)
    private String welcomeName;

    /**
     * 逻辑删除（0-标识删除,1-标识可用）
     */
    @TableLogic
    @ApiModelProperty(value = "逻辑删除",hidden = true)
    private Integer isDel;

    @TableField(exist = false)
    @JsonIgnore
    private static final long serialVersionUID = 1L;


    /**
     * Description: Algorithm.HMAC256():使用HS256生成token,密钥则是用户的密码，唯一密钥的话可以保存在服务端。
     * withAudience()存入需要保存在token的信息，这里我把用户密码存入token中
     */
    public String getToken(Gplogin user) {
        String token = "";
        token = JWT.create().withAudience(user.getUsername())
                .sign(Algorithm.HMAC256(user.getPassword()));
        return token;
    }
}